docker学习记录
一、概念
1.什么是容器?
答:容器是一种虚拟化的方案.
2.docker中文网站:www.docker-cn.com.
3.docker的架构图(三要素):
a.镜像(image):就是一个只读的模板,镜像可以创建docker实例,一个镜像可以创建很多容器,镜像就是类,容器就是镜像类的实例。
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
b.容器(container):利用容器独立运行的一个或一组应用,容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。可以把容器看作是一个建议版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一对层的统一视角,唯一区别在于容器的嘴上一层是可读可写的。
c.仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像共用户下载。国内的公开仓库包括阿里云、网易云等。
4.需要正确理解仓库/镜像/容器的概念。
docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎image镜像文件。只有用过个镜像文件才能生成docker容器。imag文件可以看作容器的模板。docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
*image文件生成的容器实例,本身也是一个文件,成为镜像文件。
*一个容器运行一种福气,当我们需要的时候,就可以通过docker'客户端创建一个对应的运行实例,也就是我们的容器
*至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓储中拉下来就可以了。
二、docker安装
1.linux系统(ubuntu0、):
a、安装前检查:内核版本:uname -a;检查Device Mapper:ls -l /sys/class/misc/device-mapper;必须满足以上两个条件。
b、安装ubuntu维护的版本:
命令如下:apt-get install docker.io,source /etc/bash_completion.d/docker.io
c、安装docker维护的版本(推荐):
命令如下:第一步检查APT的HTTPS支持 查看/usr/lib/apt/methods/https文件是否存在,如果不U你在使用apt-get update和apt-get install -y apt-transprot-https命令来安装;第二步添加docker的APT仓库,echo deb https://get.docker.com/ubuntu docker main > /etc/apt/source.list.d/docker.list;第三步是添加仓库的key,apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 -- recv-keys36A1D7869245C8950F966E92D8576A8BA88D21E9;第四步安装 apt-get update和apt-get install -y lxc-docker;以上四部比较复杂。
简单安装在博客收藏中
d.添加为root用户使用docker方法:
sudo groupadd docker
gpasswd -a 需要添加的用户名 docker
sudo service docker restart
然后再注销再登陆即可。
f.删除docker
apt-get remove docker-ce
apt autoremove docker-ce
重启docker服务的命令:systemctl restart docker
三、docker命令
1.帮助命令:docker version--查看docker的版本信息 docker info--查看docker的信息 dekcer --help -- docker命令帮助(linux是man +指令)
2.docker镜像命令:
docker images--列出本地主机上的镜像,Repository--表示镜像的仓库源,TAG:镜像标签,Image ID--镜像ID,Created:镜像创建时间,SIze:镜像的大小。
注意:同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,使用repository:TAG定义不同的镜像。
参数选项-a:代表all,列出本地所有的镜像层,包括中间镜像层
-q:只显示当前镜像的ID
--digests:显示镜像的摘要信息
--no-trunc:显示完整的镜像信息
docker search [OPTIONS] 镜像名字:搜索镜像的名字
OPTIONS说明:--no-trunc显示完整的镜像描述 -s 数字 列出收藏数(STARS)不小于指定值的镜像 --automated只列出automated build类型的镜像。
docker pull 某个镜像名字:下载镜像/docker pull 镜像名字[:TAG]例如:docker pull 镜像名:3.2为拉取镜像名的版本号,默认为lastest最新版本
docker rmi某个镜像名字ID:删除镜像 例如docker rmi -f 镜像名
一次删除多个镜像:docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部镜像名:docker rmi -f $(dokcer images -qa)
3.容器命令:
a.有镜像才能创建容器,需要先下载一个镜像
b.新建并启动容器
docker run [options] image [command] [ARG....]
options(常用)说明:有些是一个减号,有些是两个减号
--name="容器新名字":为容器指定一个名称
-d:后台运行容器,并返回群容器ID,就是启动守护式容器
-i:以交互模式运行容器。通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
列出当前所有运行的docker:
命令:docker ps [options]
options:
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器。
-n:显示最近n个创建的容器。
-q:静默模式,是显示容器编号。
--no-trunc:不截断输出
退出容器:1.exit--容器停止退出;2.ctr+P+Q--容器不停止退出
启动容器:docker start 容器id或者容器名
重启容器:docker restart 容器id或者容器名
停止容器:docker stop容器id或者容器名
强制停止容器:docker kill容器id或者容器名
删除已经停止的容器:docker rm 容器id或者容器名,一次性删除多个容器:docker rm -f$(docker ps -a -q);docker ps -a -q | xargs docker rm
重要:
1.启动守护式容器----------docker run -d 容器名,如果容器没有任何被执行,则一启动就会自杀
查看容器日志:docker logs -f -t --tail 容器ID,-t:是加入时间戳,-f:跟随最近的日志打印,--tail数字显示最后多少条
查看容器内运行的进程:docker top 容器ID
查看容器内部细节:docker inspect 容器ID(以josn字符串的形式查看容器的信息)
进入正在运行的容器并以命令行交互:a.docker exec -it 容器ID /bash/shell;b.重新进入docker attach 容器ID;以上两个区别attach直接进入容器启动命令的终端,不会启动新的进程;exec是在容器中打开新的终端,并且可以启动新的进程;并且docker exec 容器id 命令,直接在终端中不进入容器执行命令。
从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径
四、Docker镜像
1、镜像是什么?
Unions(联合文件系统)、Docker镜像加载原理、分层的镜像
联合文件系统:是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个年系统,但从外面看起来,只能看到一个文件系统,连个加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫做“镜像层”。
Docker镜像commit操作补充:
docker commit提交容器副本使之成为一个新的镜像;docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
注意:此时的容器ID是一个正在运行的容器ID
五、容器数据卷
是什么:主要干数据共享和数据持久化的工作
能干什么:容器持久化+容器间继承+数据共享
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
数据卷:
1、容器内添加:
直接命令添加:
a.命令:docker run -it -v /宿主机绝对路径目录:/容器内目录: 镜像名。
b.查看数据挂载是否成功:docker inspect 容器ID
c.容器和宿主机之间数据共享
d.容器停止退出后,主机修改后数据完全同步,需要启动之前启动的container
f.命令(带权限):docker run -it -v /宿主机绝对路径目录:/容器内目录 : ro 镜像名,ro为readonly的意思,只读
2、dockerfile添加
a.根目录下新建mydocker文件夹并进入,并建立Dockerfile脚本
例如:
# volume test
FROM centos
VOLUME ["/dataVolumeCOntainer1","/dataVolumeContainer2"] #此行命令就是构建共享文件夹绝对路径
CMD echo "finished,----------success1"
CMD /bin/bash
b.可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
c.Dokcerfile的构建(在mydocker文件夹里面构建Dockerfile文件,编写一个可执行的shell脚本)
d.build后生成镜像(可执行的镜像)-----获得一个新镜像zzyy/centos
命令:docker build -f(f是file的意思)/mydocker/dockerfile2(DOckerfile在哪) -t zzyy(命名空间)/cnetos(镜像名字) .
e.run容器
f.通过上述步骤,容器内的卷目录地址已经知道
g.主机对应默认地址
数数据卷容器:
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
总体介绍:
容器间传递共享(--volumes-from)步骤:
a.先启动一个父容器dc01-------在dataVolumeContainer2新增内容
dc02/dc03继承自dc01:--volumes-from 命令:docker run -it --name dc02 --volumes-from dc01 容器名字
dc02/dc03分别在dataVolumeContainer2各自新增内容
回到dc01可以看到02/03各自添加的都能共享了
删除dc01后2和3的数据仍然存在
删除dc01,dc02修改后dc03可否访问,可以访问
删除dc02后dc03可否访问
新建dc04继承dc03可否访问
新建dc04继承dc03后在删除dc03
结论:容器之间配置信息的传递,数据卷的生命周期一致持续到没有容器使用它为止
b.dc02/dc03可以看到02/03各自添加的都能共享
六.Dockerfile解析
1.手动编写一个dockerfile文件,必须要符合file的规范
2.有这个文件后,直接dockee build 命令执行,获得一个自定义的镜像
3.run
以上三部是构建三步骤
4.是什么:Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构建的脚本
5.dockerfile的解析过程:
a.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
b.指令按照从上到下,顺序执行
c.#表示注释
d.每条指令都会创建一个新的镜像层,并对镜像进行提交
6.docker执行的Dockerfile的大致流程:
a.docker从基础镜像运行一个容器
b.执行一条指令并对容器做出修改
c.执行类似docker commit的操作提交一个新的镜像层
d.docker再基于刚提交的镜像运行一个新的容器
f.执行dockerfile中的下一条指令直到所有指令都执行完成
总结:Dokcerfile是软件的原材料
Docker镜像是软件的交付品
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合理充当Dokcer体系的基石。
a.Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及内容包括执行代码或者是文件、环境、变量、依赖包、运行时环境、动态链接库、操作系统的发展、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道。这时需要考虑如何设计namespace的权限控制)等等
b.Docker镜像,在用Dockerfile定义一个文件后,docker build时会产生一个Docker镜像,当运行Docker镜像时,回真正开始提供服务
c.Docker容器,容器是直接提供服务的。
Dockerfile保留字指令:
FROM------基础镜像,当前新镜像是基于哪个镜像的(继承于哪个镜像)
MAINTAINER------镜像维护者的名字和邮箱,就是作者信息
RUN------容器构建时需要运行的命令(程序运行到这一行需要执行的额外命令)
EXPOSE-----当前容器对外暴露出的端口号
WORKDIR----指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV----用来在构建镜像过程中设置环境变量
ADD----将宿主机目录下的文件拷贝进镜像且ADD命令回自动处理URL和解压tar压缩包
COPY----类似ADD,拷贝文件和目录到镜像中。将从构建上下目录中<源路径>的文件/目录赋值到新的一层的镜像内的<目标路径>位置
VOLUME----容器数据全,用一数据保存和持久化工作
CMD----指定(1)容器启动时要运行的命令;(2)Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换;(3)CMD指令的格式和RUN相似,也是两种格式:a.shell格式,CMD<命令>;b.exec格式:CMD[“可执行文件”,“参数1”,“参数2”....];c.参数列表格式:CMD["参数1",“参数2”...],在指定了ENTRYPIONT指令后,用CMD指定具体的参数。
ENTRYPOINT---- (1).指定一个容器时要运行的命令;(2)ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数;(3)docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合
ONBUILD-----当构建一个被继续的Dockerfile时运行命令,父镜像在被子继承后父镜像的nobuild被触发
案例:
a.Base镜像(scratch)----Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
b自定义镜像mycentos:
1.编写:
(1).编写:Hub默认Centos镜像什么情况
(2).编写Dockerfile文件
(3).myCentos内容Dockerfile
FROM Centos
MAINTAINER xqj
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y vim
RUN yum -y net-tools
EXPOSE 80
CMD /bin/bash
2.构建:docker build -f dockerfile的文件路径 -t 新镜像名字:TAG 例如:docker build -f /mydocker/Dockerfiles2 -t mycentos:1.3 .
3.运行:docker run -it 新镜像名字:TAG
4.列出镜像的变更历史:docker history 新镜ID
七.本地镜像推送到阿里云
1.在阿里云上创建镜像仓库包括命名空间个仓库名字
2.镜像推送到阿里云
注意:运行完docker实例以后如果不删除历史运行的实例会占用硬盘空间,删除历史运行实例的命令是:docker rm $(docker ps -aq)